﻿using ExcellentProjectPlus.Dominio.Calificaciones.Servicios.CalificacionParcialEstudiantes;
using ExcellentProjectPlus.Dominio.Calificaciones.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Calificaciones.CalificacionParcialEstudiantes
{
    public class ServicioDeGestionDeCalificacionParcialEstudiantes:IServicioDeGestionDeCalificacionParcialEstudiantes
    {
        #region Propiedades
        IServicioDeAdministracionDeCalificacionParcialEstudiantes _servicioDeAdministracionDeCalificacionParcialEstudiantes;
        #endregion

        #region Costructores
        public ServicioDeGestionDeCalificacionParcialEstudiantes(IServicioDeAdministracionDeCalificacionParcialEstudiantes servicioDeAdministracionDeCalificacionParcialEstudiantes)
        {
            _servicioDeAdministracionDeCalificacionParcialEstudiantes = servicioDeAdministracionDeCalificacionParcialEstudiantes;
        }
        #endregion

        public IEnumerable<CalificacionParcialEstudiante> ObtenerCalificacionParcialEstudiantes()
        {
            IEnumerable<CalificacionParcialEstudiante> resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeCalificacionParcialEstudiantes.ObtenerCalificacionParcialEstudiantes();
                transaccion.Complete();
            }

            return resultado;
        }

        public CalificacionParcialEstudiante ObtenerCalificacionParcialEstudiantePorId(int id)
        {
            CalificacionParcialEstudiante resultado = null;
            var txtOptions = new TransactionOptions();
            txtOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            txtOptions.Timeout = TimeSpan.FromMinutes(2);
            using(var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, txtOptions))
            {
                resultado = _servicioDeAdministracionDeCalificacionParcialEstudiantes.ObtenerCalificacionParcialEstudiantePorId(id);
                transaccion.Complete();
            }
            return resultado;
        }

        public void AgregarCalificacionParcialEstudiante(CalificacionParcialEstudiante calificacionParcialEstudiante)
        {
            _servicioDeAdministracionDeCalificacionParcialEstudiantes.AgregarCalificacionParcialEstudiante(calificacionParcialEstudiante);
        }
        public void ModificarCalificacionParcialEstudiante(CalificacionParcialEstudiante calificacionParcialEstudiante)
        {
            _servicioDeAdministracionDeCalificacionParcialEstudiantes.ModificarCalificacionParcialEstudiante(calificacionParcialEstudiante);
        }
        public void EliminarCalificacionParcialEstudiante(CalificacionParcialEstudiante calificacionParcialEstudiante)
        {
            _servicioDeAdministracionDeCalificacionParcialEstudiantes.EliminarCalificacionParcialEstudiante(calificacionParcialEstudiante);
        }

        public IEnumerable<CalificacionParcialEstudiante> ObtenerCalificacionParcialEstudiantesPaginado(int pagina, int tamanio)
        {
            return _servicioDeAdministracionDeCalificacionParcialEstudiantes.ObtenerCalificacionParcialEstudiantesPaginado(pagina, tamanio);
        }
    }
}
